package com.example.service.impl;

import com.example.mapper.EmpExprMapper;
import com.example.mapper.EmpLogMapper;
import com.example.mapper.EmpMapper;
import com.example.pojo.*;
import com.example.service.EmpLogService;
import com.example.service.EmpService;
import com.example.utils.JwtUtils;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @Auther: Sun - 作者信息
 * @Date: 2025/9/16 - 09 - 16 - 15:42 - 创建日期
 * @Description: com.example.service.impl - 实现类所在的包路径
 *
 * 这是一个员工服务接口的实现类
 * 该类实现了EmpService接口，用于处理员工相关的业务逻辑
 */
@Slf4j
@Service
public class EmpServiceImpl implements EmpService {
    @Autowired
    private EmpMapper empMapper;
    @Autowired
    private EmpExprMapper empExpr;
    @Autowired
    private EmpExprMapper empExprMapper;
    @Autowired
    private EmpLogService empLogService;
    //原始分页查询
//    @Override
//    public PageResult<Emp> page(Integer page, Integer pageSize) {
//        Long total = empMapper.count();
//        List<Emp> rows = empMapper.list((page - 1) * pageSize, pageSize);
//
//
//        return new PageResult<Emp>(total, rows);
//    } // 声明EmpServiceImpl类，实现EmpService接口
//        @Override
//    public PageResult<Emp> page(Integer page, Integer pageSize, String name, Integer gender, LocalDate begin, LocalDate end) {
////1.设置分页参数
//            PageHelper.startPage(page,pageSize);
////2.执行查询
//            List<Emp> rows = empMapper.list(name, gender, begin, end);
////3.解析并封装
//            Page<Emp> p = (Page<Emp>) rows;
//
//
//            return new PageResult<Emp>(p.getTotal(),p.getResult());
//}
        public PageResult<Emp> page(EmpQueryParam empQueryParam) {
//1.设置分页参数
            PageHelper.startPage(empQueryParam.getPage(),empQueryParam.getPageSize());
//2.执行查询
            List<Emp> rows = empMapper.list(empQueryParam);
//3.解析并封装
            Page<Emp> p = (Page<Emp>) rows;


            return new PageResult<Emp>(p.getTotal(),p.getResult());
        }
@Transactional(rollbackFor = {Exception.class})//默认运行时异常才会回滚
    @Override
    public void save(Emp emp) throws Exception {
    try {
        emp.setCreateTime(LocalDateTime.now());
        emp.setUpdateTime(LocalDateTime.now());
        empMapper.insert(emp);

//        int i =1/0;
        List<EmpExpr> exprList = emp.getExprList();
        if(!CollectionUtils.isEmpty(exprList)){
            exprList.forEach(empExpr->{
                empExpr.setEmpId(emp.getId());
            });
            empExprMapper.insertBatch(exprList);
        }
    } finally {
        EmpLog empLog = new EmpLog(null,LocalDateTime.now(),"新增员工" + emp);
        empLogService.insertLog(empLog);
    }
    //记录操作日志

    }

    @Override
    public LoginInfo login(Emp emp) {
        Emp e= empMapper.selectByUserNameAndPassword(emp);
        if(e!=null){
            log.info("用户登录成功，信息：{}",e);
//            生成Jwt令牌
            Map<String,Object> claims = new HashMap<>();
            claims.put("id",e.getId());
            claims.put("username",e.getUsername());
           String jwt =  JwtUtils.generateJwt(claims);
            return new LoginInfo(e.getId(),e.getUsername(),e.getName(),jwt);
        }
        return null;
    }

    @Override
    public List<Emp> listAll() {
        return empMapper.listAll();
    }

    @Transactional(rollbackFor = Exception.class)
    @Override
    public void update(Emp emp) {
//        1.根据员工id修改员工基本信息
        emp.setUpdateTime(LocalDateTime.now());
        empMapper.updateById(emp);
//        2.修改员工经历信息
//        1.删除
        empExprMapper.deleteByEmpIds(Arrays.asList(emp.getId()));
//        2.添加
        List<EmpExpr> exprList = emp.getExprList();
        if(!CollectionUtils.isEmpty(exprList)){
            exprList.forEach(empExpr->{
                empExpr.setEmpId(emp.getId());
            });
            empExprMapper.insertBatch(exprList);
        }
    }

    @Override
    public Emp getById(Integer id) {
        return empMapper.getById(id);

    }

    @Transactional(rollbackFor = {Exception.class})
    @Override
    public void delete(List<Integer> ids) {
//        1.删除员工的基本信息
        empMapper.deleteids(ids);

//        2.删除员工的工作经历
        empExprMapper.deleteByEmpIds(ids);
    }
}
